package com.tl.ip_location_relation_v4.controller;

import java.util.Collections;
import java.util.List;
import java.util.Scanner;

import com.tl.ip_location_relation_v4.entity.Ip;
import com.tl.ip_location_relation_v4.functionInterface.OprationInterface;
import com.tl.ip_location_relation_v4.service.IpSearchV1;
import com.tl.ip_location_relation_v4.utils.ConfigUtil;
import com.tl.ip_location_relation_v4.utils.IpUtil;

/**
 * 
 * @author Antg
 * @date 2021年7月13日
 * @Description V1: <br>
 *              1.将全部数据加载到内存中,形成一个ip对象List<br>
 *              2.对这个list进行递归二分查询<br>
 *              3.对这个list进行循环二分查询<br>
 *              4.对这个list进行从撒上到下的普通查询<br>
 */
public class ControllerV1 {
	private static String ipFile = ConfigUtil.getConfig("file");
	private static String charSet = ConfigUtil.getConfig("charset");
	private static String ip = "";
	private static Scanner scanner = new Scanner(System.in);
	private static List<Ip> ipList = null;
	private static long beginTime = 0L;

	public static void run() {
		System.out.println("==========欢迎进入v1版本==========");
		// 数据加载
		beginTime = System.currentTimeMillis();
		ipList = IpUtil.loadDataAndSwitchV1(ipFile, charSet);
		System.out.println("数据加载用时--->"
				+ (System.currentTimeMillis() - beginTime) + "毫秒");
		// 数据排序
		beginTime = System.currentTimeMillis();
		Collections.sort(ipList);
		System.out.println("数据排序用时--->"
				+ (System.currentTimeMillis() - beginTime) + "毫秒");
		// 数据查询
		System.out.println("============功能列表============");
		System.out.println("1 : 普通方法查询ip所属区域");
		System.out.println("2 : 二分法查询ip所属区域(递归实现)");
		System.out.println("3 : 二分法查询ip所属区域(while循环实现)");
		System.out.println("0 : 退出系统");
		System.out.println("==============================");
		while (true) {
			System.out.print("请选择操作:");
			String op = scanner.next();
			if (!op.equals("0") && !op.equals("1") && !op.equals("2")
					&& !op.equals("3")) {
				System.out.println("输入有误,请重新输入");
				continue;
			}
			switch (op) {
			case "1":
				opration((x, y) -> IpSearchV1.searchIpLocation(x, y), ipList,
						ip);
				break;
			case "2":
				opration((x, y) -> IpSearchV1.biSearchByLoop(x, y), ipList, ip);
				break;
			case "3":
				opration((x, y) -> IpSearchV1.biSearchByRecursion(x, y),
						ipList, ip);
				break;
			case "0":
				System.out.println("退出成功!");
				return;
			}
		}
	}

	/**
	 * 
	 * @author Antg
	 * @date 2021年7月6日
	 * @param
	 * @retun
	 * @Description 打印结果的方法
	 */
	public static void printResult(List<Ip> ipList, int result) {
		if (result < 0) {
			System.out.println("未查询到结果");
			return;
		}
		System.out.println("该ip所属的区域在--->" + ipList.get(result).getArea());
		return;
	}

	/**
	 * 
	 * @author Antg
	 * @date 2021年7月6日
	 * @param
	 * @retun
	 * @Description 使用函数式接口简化代码
	 */
	public static void opration(OprationInterface func, List<Ip> ipList,
			String ip) {
		System.out.print("请输入要查询的ip地址:");
		ip = scanner.next();
		if (!IpUtil.validateIp(ip)) {
			System.out.println("ip地址格式不正确,请检查");
			return;
		}
		beginTime = System.currentTimeMillis();
		int result = func.op(ipList, ip);
		printResult(ipList, result);
		System.out.println("数据查询用时--->"
				+ (System.currentTimeMillis() - beginTime) + "毫秒");
	}
}
